package com.anzia.study_6.data;

import com.anzia.study_6.ResourceTable;
import ohos.aafwk.ability.AbilitySlice;
import ohos.agp.components.*;

import java.util.ArrayList;
import java.util.List;

public class ListItemProvider extends RecycleItemProvider {

	// 需要一个AbilitySli
	private AbilitySlice mySlice;
	// 需要封装列表中显示的数据的属性
	// 集合，Data，City
	private List<Data> datas = new ArrayList<>();
	// 声明一个接口，将将点击list里的元素的时候，将被点击的元素信息，传出去到AbilitySlice
	private OnItemClickListener listener;

	public ListItemProvider(AbilitySlice mySlice, OnItemClickListener listener) {
		this.mySlice = mySlice;
		this.listener = listener;
	}

	// setData方法，是为数据源填充真正数据
	public void setData(List<City> cities) {
		datas.clear();
		// 实现列表的目标，是以行显示三个城市，每个Data里包括三个城市的city
		int i = 0;
		ArrayList<City> tmpCities = new ArrayList<>();

		for (City city : cities) {
			if (i == 3) {
				i = 0;
				// 以三个城市为一组将城市队列存到datas中
				datas.add(new Data(tmpCities));
				// 初始化城市队列，再重新添加
				tmpCities = new ArrayList<>();
			}
			tmpCities.add(city);
			i++;
		}

		// 可能cities尾巴上，不足3个城市，32个，后面剩下2个
		datas.add(new Data(tmpCities));
		// 更新了数据，还要执行一个方法，通知页面更新数据
		this.notifyDataChanged();

	}

	@Override
	public int getCount() {
		return datas.size();
	}

	@Override
	public Object getItem(int i) {
		return null;
	}

	@Override
	public long getItemId(int i) {
		return 0;
	}

	// 获得ListContainer下的组件
	// 系统会循环调用该方法
	@Override
	public Component getComponent(int i, Component component, ComponentContainer componentContainer) {

		// i：列表中的数据所在的位置，从0开始，i+1就是行数
		// component：需要重用上一个组件
		// componentContainer：当前获取的组件的父组件

		// 在非AbilitySlice中获取布局
		Component component1 = LayoutScatter.getInstance(mySlice).parse(ResourceTable.Layout_list_item, null, false);
		if (!(component1 instanceof ComponentContainer))
			return null;
		ComponentContainer rootLayout = (ComponentContainer) component1;
		Data data = datas.get(i);

		for (City city : data.getCities()) {
			Text cityTitle = (Text) LayoutScatter.getInstance(mySlice).parse(ResourceTable.Id_citytitle, null, false);
			cityTitle.setText(city.getCityCode() + "，" + city.getCityName());
			cityTitle.setClickedListener(component2 -> {
				listener.onItemClick(city, i);
			});
			rootLayout.addComponent(cityTitle);
		}

		return component1;
	}

	public interface OnItemClickListener {
		void onItemClick(City city, int index);
	}
}
